package sicnu.cs.ich.activity.rest;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import sicnu.cs.ich.activity.service.IActivityService;
import sicnu.cs.ich.api.common.ResultInfo;
import sicnu.cs.ich.api.common.enums.FileEnum;
import sicnu.cs.ich.api.domain.entity.ActivityImg;
import sicnu.cs.ich.api.domain.form.ActivityForm;
import sicnu.cs.ich.api.domain.form.AddCallForm;
import sicnu.cs.ich.common.services.IFileUploadService;
import sicnu.cs.ich.common.util.ResultInfoUtil;
import sicnu.cs.ich.security.service.IRoleService;
import sicnu.cs.ich.security.service.IUserService;
import sicnu.cs.ich.security.util.SecurityUtil;

import javax.validation.Valid;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;

import static sicnu.cs.ich.common.util.FileUtils.isImage;


/**
 * @author 黎琦
 * @date 2021/11/26 11:33
 **/
@RestController
@Slf4j
@RequiredArgsConstructor
@RequestMapping("/call")
@Api(tags = {"号召相关操作(需要登录)"})
public class CallResource {
    private final IActivityService iActivityService;
    private final IUserService userService;

    private final IFileUploadService fileUploadService;

    @GetMapping("/addCheck")
    @ApiOperation("添加号召前检测是否进行实名认证")
    public ResultInfo<Void> isCertified(){
        if(SecurityUtil.hasAuthority("act:call:add")){
            return ResultInfoUtil.buildError("没有进行实名认证");
        }
        return ResultInfoUtil.buildSuccess("已实名");
    }

    @PostMapping("/callInfo")
    @ApiOperation("添加号召")
    @PreAuthorize("hasAuthority('act:call:add')")
    //,@RequestParam String[] imgRemarks
    public ResultInfo<Integer> addCall(@Valid AddCallForm addCallForm,@RequestParam MultipartFile[] publicImgs) throws IOException {
        //先判断该用户是否已认证
        // 使用身份进行实名认证
        //if (userInfoService.certified(SecurityUtil.getCurrentUserId()) <= 0) {
        //    return ResultInfoUtil.buildError("没有进行实名认证");
        //}

        // 验证文件是否为空
        if(publicImgs.length==0){
            return ResultInfoUtil.buildError("图片不能为空");
        }
        //验证文件格式
        var fileList = isImage(publicImgs);
//        这里不能删，以后用
//        //校验所有图片都要有描述
//        if(publicImgs.length-1!=imgRemarks.length){
//            throw new RuntimeException("所有图片都需要有描述");
//        }

        //将图片放到数组中传入service层
        //将第一章封面图片放到addCallForm中
        String filePath = fileUploadService.uploadFile((FileInputStream) publicImgs[0].getInputStream(), FileEnum.ACTIVITY_COVER_IMG, publicImgs[0].getOriginalFilename());
        addCallForm.setPublicImg(filePath);
        //后面的图片需要有图片描述（暂时不启用）
        ArrayList<ActivityImg> images = new ArrayList<>();
        for (int i=1;i<publicImgs.length;i++) {
            filePath = fileUploadService.uploadFile((FileInputStream) publicImgs[i].getInputStream(), FileEnum.ACTIVITY_COVER_IMG, publicImgs[i].getOriginalFilename());
//            images.add(ActivityImg.builder().img(filePath).remark(imgRemarks[i-1]).build());
            images.add(ActivityImg.builder().img(filePath).build());
        }

        Integer aid = iActivityService.insert(addCallForm, SecurityUtil.getCurrentUserId(),1,images);
        return ResultInfoUtil.buildSuccess(aid);
    }

    @PostMapping("/response")
    @ApiOperation("响应号召")
    public ResultInfo<Void> responseCall(@RequestParam("callID") Integer activityId){
        //参数校验
        // @RequestParam默认为required，不需要校验
        //if(activityId==null){
        //    return ResultInfoUtil.buildError("activityId为空");
        //}
        iActivityService.participate(activityId, SecurityUtil.getCurrentUserId());
        return ResultInfoUtil.buildSuccess();
    }

    /**
     * 号召转为活动（检测是否满足条件）
     * @param aid
     * @return
     */
    @PutMapping("/changeCheck")
    @ApiOperation("号召转为活动时检测是否满足条件")
    public ResultInfo<Void> callToActivity(@RequestParam("callID") Integer aid){
        //参数校验
        if(aid==null){
            return ResultInfoUtil.buildError("activityId为空");
        }
        iActivityService.callToActivity(aid);
        return ResultInfoUtil.buildSuccess();
    }

    @PutMapping("/callInfo")
    @ApiOperation("号召转为活动并更新信息")
    public ResultInfo<Void> updateInfo(@Valid ActivityForm activityForm, MultipartFile[] publicImgs) throws IOException {
        // 验证文件格式
        if(publicImgs==null){
            return ResultInfoUtil.buildError("封面图片不能为空");
        }
        //验证文件格式
        var fileList = isImage(publicImgs);
        //将图片放到数组中传入service层
        //将第一章封面图片放到addCallForm中
        String filePath = fileUploadService.uploadFile((FileInputStream) publicImgs[0].getInputStream(), FileEnum.ACTIVITY_COVER_IMG, publicImgs[0].getOriginalFilename());
        activityForm.getActivities().setImgUrl(filePath);

        //后面的图片需要有图片描述（这一坨多图片的处理暂时不启用）
        ArrayList<ActivityImg> images = new ArrayList<>();
        for (int i=1;i<publicImgs.length;i++) {
            filePath = fileUploadService.uploadFile((FileInputStream) publicImgs[i].getInputStream(), FileEnum.ACTIVITY_COVER_IMG, publicImgs[i].getOriginalFilename());
//            images.add(ActivityImg.builder().img(filePath).remark(imgRemarks[i-1]).build());
            images.add(ActivityImg.builder().img(filePath).build());
        }

        iActivityService.updateInfo(activityForm,images);
        return ResultInfoUtil.buildSuccess();
    }



//    @GetMapping("/batchPass")
//    @ApiOperation("批量将待审核参与者按照最大人数转为已通过")
//    public ResultInfo<Void> BatchPass(Integer uid){
//
//    }
}
